// 连接棒材的最低费用(洛谷测试)
// 你有一些长度为正整数的棍子
// 这些长度以数组sticks的形式给出
// sticks[i]是第i个木棍的长度
// 你可以通过支付x+y的成本将任意两个长度为x和y的棍子连接成一个棍子
// 你必须连接所有的棍子，直到剩下一个棍子
// 返回以这种方式将所有给定的棍子连接成一个棍子的最小成本
// 测试链接 : https://www.luogu.com.cn/problem/P1090
// 请同学们务必参考如下代码中关于输入、输出的处理
// 这是输入输出处理效率很高的写法
// 提交以下的code，可以直接通过

#include <bits/stdc++.h>

using namespace std;

const int MAXN = 10001;
int heap[MAXN]; // 小根堆
int sz; // 堆的大小
int nums[MAXN];
int n;

void add(int x)
{
    heap[sz] = x;
    int i = sz++;
    while(heap[i] < heap[(i - 1) / 2])
    {
        swap(heap[i], heap[(i - 1) / 2]);
        i = (i - 1) / 2;
    }
}

int pop()
{
    int ans = heap[0];
    swap(heap[0], heap[--sz]);
    int i = 0, l = 1, best;
    while(l < sz)
    {
        best = l + 1 < sz && heap[l + 1] < heap[l] ? l + 1 : l;
        best = heap[best] < heap[i] ? best : i;
        if(best == i) break;
        swap(heap[best], heap[i]);
        i = best;
        l = 2 * i + 1;
    }
    return ans;
}

int minCost()
{
    for(int i = 0; i < n; ++i) add(nums[i]);
    int sum = 0, cur = 0;
    while(sz > 1)
    {
        cur = pop() + pop();
        sum += cur;
        add(cur);
    }
    return sum;
}

int main()
{
    scanf("%d", &n);
    for(int i = 0; i < n; ++i) scanf("%d", &nums[i]);
    printf("%d\n", minCost());

    return 0;
}